﻿#include <QFile>
#include <iostream>
#include <string>
#include <fstream>
#include <assert.h>
#include <qDebug>
#include "corecrt_math_defines.h"
#include "FinalReportData.h"
#include "FinalReportDataManager.h"
#include "BaseModule/QJsonHelper/QJsonSerializer.h"
#include "BaseModule/GlobalHelper.h"
//#include "BaseModule/IBaseSignal.h"

using namespace std;
namespace GenerateReport
{
    // <FinalReportData>
    FinalReportData::~FinalReportData()
    {
        if (m_finalReportTotalData.size())
            m_finalReportTotalData.clear();
    }
    FinalReportData* FinalReportData::_instance = nullptr;

    FinalReportData* FinalReportData::getinstance()
    {
        if (_instance == nullptr)
        {
            _instance = new FinalReportData;
        }
        return _instance;
    }

    void  FinalReportData::appendFinalReport(QStringList finalReportInformation)
    {
        DuplicateFileJudgment(finalReportInformation.at(1));
        m_finalReportTotalData.append(finalReportInformation);
    }
    QList<QStringList>  FinalReportData::getFinalReportTotalData()
    {
        //返回数据之前，判断文件是否存在
        //同名文件，最新文件可用
        ReportExistentialJudgments();
        return m_finalReportTotalData;
    }

    int FinalReportData::getFinalReportCount()
    {
        return m_finalReportTotalData.size();
    }

    void  FinalReportData::deleteFinalReports(QList<QStringList> FinalReports)
    {

    }

    void FinalReportData::sort()
    {
    }

    void FinalReportData::ReportExistentialJudgments()
    {
        auto _count = getFinalReportCount();
        for (int _i = 0; _i < _count; _i++)
        {
            auto _sigleReportInfoList = m_finalReportTotalData.at(_i);
            auto _filePath = _sigleReportInfoList.at(1);
            if (!QFile::exists(_filePath) && _sigleReportInfoList.at(3) == "true")
            {
                //如果文件不存在且标志位为true则置为false
                _sigleReportInfoList.removeAt(3);
                _sigleReportInfoList += QString("false");
                m_finalReportTotalData.removeAt(_i);
                m_finalReportTotalData.insert(_i, _sigleReportInfoList);
            }
            else if (QFile::exists(_filePath) && _sigleReportInfoList.at(3) == "false")
            {
                //如果文件存在且标志位为false则置为true
                _sigleReportInfoList.removeAt(3);
                _sigleReportInfoList += QString("true");
                m_finalReportTotalData.removeAt(_i);
                m_finalReportTotalData.insert(_i, _sigleReportInfoList);
            }
        }
    }

    void FinalReportData::DuplicateFileJudgment(QString finalReportFilePath)
    {
        for (auto _sigleFinalReport : m_finalReportTotalData)
        {
            //完整路径完全相同，说明同名文件已被覆盖，则删除记记录
            if (_sigleFinalReport.at(1) == finalReportFilePath)
            {
                m_finalReportTotalData.removeOne(_sigleFinalReport);
            }
        }
    }

    void FinalReportData::readConfig()
    {
        //read的时候，通过参数把坐标系全部重新创建一遍（把cmd的内容复制过来）
        QString configFilePath = GlobalHelperInstance->getProjectTempIODir() + "/FinalReportData.json";
        QByteArray _strJson;
        if (GlobalHelperInstance->readFile(configFilePath, _strJson))
        {
            QJsonHelper::QJsonSerializer _jsonSerializer;
            auto _finalReportDataManager = _jsonSerializer.deserialize<FinalReportDataManager*>(_strJson);
            if (_finalReportDataManager)
            {
                m_configData = QSharedPointer<FinalReportDataManager>(_finalReportDataManager);
                auto _finalReportList = m_configData->getFinalReportList();
                auto _finalReportTotalDataOutput = _finalReportList;
                for (auto _sigleReportInfoQString : _finalReportTotalDataOutput)
                {
                    auto _sigleReportInfoList = _sigleReportInfoQString.split("||");
                    m_finalReportTotalData.append(_sigleReportInfoList);
                }
            }
        }
        else
        {
            qDebug() << "deserialize FinalReportTotalData fail !";
        }
    }

    void FinalReportData::writeConfig()
    {
        if(getFinalReportCount())
        {
            QString configFilePath = GlobalHelperInstance->getProjectTempIODir() + "/FinalReportData.json";
            if (!m_configData)
            {
                m_configData = QSharedPointer<FinalReportDataManager>(new FinalReportDataManager());
            }
            else
            {
                m_configData->clear();
            }

            QList<QString> _finalReportTotalDataOutput{};
            for (auto _sigleReportInfoList : m_finalReportTotalData)
            {
                QString _sigleReportInfoQString{};
                _sigleReportInfoQString+= _sigleReportInfoList.at(0) + QString("||");
                _sigleReportInfoQString+= _sigleReportInfoList.at(1) + QString("||");
                _sigleReportInfoQString+= _sigleReportInfoList.at(2) + QString("||");
                _sigleReportInfoQString+= _sigleReportInfoList.at(3) ;
                _finalReportTotalDataOutput.append(_sigleReportInfoQString);
            }
            m_configData->setFinalReportList(_finalReportTotalDataOutput);

            QJsonHelper::QJsonSerializer _jsonSerializer;
            QByteArray bytes = _jsonSerializer.serialize<FinalReportDataManager*>(m_configData.get());
            GlobalHelperInstance->writeFile(configFilePath, bytes);
        }
    }

    void FinalReportData::resetData()
    {
    }

    void FinalReportData::dataToByteArray(QByteArray* byteArray)
    {
    }

    void FinalReportData::printReportData()
    {
        for (auto report : m_finalReportTotalData)
        {
            std::cout << "---m_finalReportTotalData ---" << report.at(1).toStdString() << std::endl;
        }
    }

}

